/**
 * @file mem_pool_example.cpp
 * @brief 内存池使用示例
 * @details 演示如何使用MemPool类进行内存分配和释放
 */

#include "mem_pool.h"

/**
 * @struct MyStruct
 * @brief 示例结构体
 * @details 包含三个整数的简单结构体，用于演示内存池对结构体的管理
 */
struct MyStruct {
  int d_[3]; /**< 整数数组，存储三个值 */
};

/**
 * @brief 主函数
 * @details 演示如何使用MemPool类分配和释放基本类型和结构体对象
 * @return 程序退出码，0表示成功
 */
int main(int, char **) {
  using namespace Common;

  /**
   * @brief 创建管理基本类型(double)的内存池
   * @details 预分配50个元素的空间
   */
  MemPool<double> prim_pool(50);
  
  /**
   * @brief 创建管理结构体(MyStruct)的内存池
   * @details 预分配50个元素的空间
   */
  MemPool<MyStruct> struct_pool(50);

  /**
   * @brief 循环测试内存池的分配和释放功能
   * @details 分配50个对象，并每5个对象释放一次
   */
  for(auto i = 0; i < 50; ++i) {
    // 从基本类型内存池分配一个double对象
    auto p_ret = prim_pool.allocate(i);
    // 从结构体内存池分配一个MyStruct对象
    auto s_ret = struct_pool.allocate(MyStruct{i, i+1, i+2});

    // 输出分配的基本类型对象的值和地址
    std::cout << "prim elem:" << *p_ret << " allocated at:" << p_ret << std::endl;
    // 输出分配的结构体对象的值和地址
    std::cout << "struct elem:" << s_ret->d_[0] << "," << s_ret->d_[1] << "," << s_ret->d_[2] << " allocated at:" << s_ret << std::endl;

    // 每5个对象释放一次，演示内存池的重用机制
    if(i % 5 == 0) {
      std::cout << "deallocating prim elem:" << *p_ret << " from:" << p_ret << std::endl;
      std::cout << "deallocating struct elem:" << s_ret->d_[0] << "," << s_ret->d_[1] << "," << s_ret->d_[2] << " from:" << s_ret << std::endl;

      // 将对象返回到内存池
      prim_pool.deallocate(p_ret);
      struct_pool.deallocate(s_ret);
    }
  }

  // 程序成功返回
  return 0;
}
